import {AIConfig, LayaAPICode, LayaAPIStatus} from "./AIConfig";
import { AIPanel } from "./AIPanel";
import { IDEAgent } from "./IDEAgent";
import { post } from "./Imagen";
import {LayaAPI} from "./LayaAPI";

export class AIUtils {
    static async translation(str: string): Promise<string | null> {
        let res: any = await LayaAPI.create().laya_translate(str);
        if (res && res.code === LayaAPICode.CodeSuccess && res.data.status === LayaAPIStatus.TaskStatusDone) {
            return res.data.content;
        }
        return null;
    }

    /**
     * 遍历当前场选中的对象，执行函数fn
     * @param fn
     */
    static forEachSelect(fn:Function){
        let selects = Editor.scene.getSelection();
        selects.forEach((v)=> {
            fn(v);
        });
    }
}


export async function delay(ms: number) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(0);
        }, ms);
    });
}

export function trimComment(prompt: string) {
    /** 把prompt按照回车拆分 */
    let prompts = prompt.split('\n');
    /** prompts如果以#开头则过滤掉 */
    prompts = prompts.filter((v) => {
        return v.trim()[0] != '#';
    })
    /** 剩下的重新用回车组合起来 */
    return prompts.join('\n');
}

export function trimJavascript(str:string){
    let head = '\`\`\`javascript';
    let tail = '\`\`\`';
    let idx = str.indexOf(head);
    if(idx>=0){
        str = str.substring(idx+head.length)
    }
    idx = str.lastIndexOf(tail);
    if(idx>=0){
        str = str.substring(0,idx)
    }
    return str;
}

// export function runJs(str:string,context:any){
//     let F = new Function('context',str)
//     F.call(null,context);    
// }

/**
 * 去掉字符串中的换行符
 * 去掉开头结尾的空格
 * @param str
 */
export function trimBR(str:string){
    let lines = str.split('\n');
    for(let i=0;i<lines.length;i++){
        lines[i] = lines[i].trim();
    }
    return lines.join(' '); //用空格连接起来，没有空格会有错误， 例如 style="xxx"onclick="xxx"
}


export function clamp(v:number, min:number, max:number){
    return Math.max(Math.min(v,max),min);
}

export async function getChooseOption(config:string[],input: string,errorStr: string) {
    const configStr = config.join('、');

    let prompt: string = `你是LayaIDE，你可以帮助用户完成很多任务。`
        + `当前支持以下功能：${configStr}。`
        + `作为IDE，你可以直接使用这些功能。`
        + `如果用户提出要使用这些功能中的一个或提出要你帮他使用这些功能中的一个，请回答用户这个功能的名字。`
        + `你要进行模糊匹配，例如用户输入了“层级面板”，你要匹配到“切换到层级面板”。如果无法匹配到选项, 请回答：“${errorStr}”。`
        + `下面是用户的输入：${input}。`

    let res: any = await LayaAPI.create().laya_ernie_bot(prompt);
    if(!res || res.code !== LayaAPICode.CodeSuccess || res.data.status !== LayaAPIStatus.TaskStatusDone){
        return null;
    }

    let str = res.data.content;
    let out: any = {};
    if (str.indexOf(errorStr) != -1) {
        out.code = 1;
        out.content = errorStr;
    } else {
        for (let i = 0, len = config.length; i < len; i++) {
            let configStr = config[i];
            if (str.indexOf(configStr) >= 0){
                out.code = 0;
                out.content = configStr;
                break;
            }
        }
    }

    return out;

}

export function reclog(msg: string, userinfo: any) {
}

export function reportQueryError(status:number){
    let panel = AIPanel.ins;
    if(!panel)
        return;
    let errtable:any={    };
    errtable[LayaAPIStatus.TaskStatusWaiting]='任务在排队中';
    errtable[LayaAPIStatus.TaskStatusCccupied]='任务需要的服务被用户的其他任务占用了，这个任务正在等待占用的任务完成。';
    errtable[LayaAPIStatus.TaskStatusParamError]='参数错误';
    errtable[LayaAPIStatus.TaskStatusIsFull]='个人任务队列已满，暂时不能再提交新任务,请等待上一个任务完成。';
    errtable[LayaAPIStatus.TaskStatusEncodeFail]='任务请求编码失败'
    errtable[LayaAPIStatus.TaskStatusDeliveryFail]='投递任务请求失败。';
    errtable[LayaAPIStatus.TaskStatusQueryResultFail]='服务进度查询失败';
    errtable[LayaAPIStatus.TaskStatusUnmarshalFail]='服务回馈解码失败。';
    errtable[LayaAPIStatus.TaskStatusTooLong]='任务请求内容过长';
    
    let errstr = errtable[status]||`请求错误:${status}`;
    panel.addMsg(errstr,-1);
}